/*
定义一个类，创建一个对象
 */
package main

import "fmt"

// 如果类名首字母大写，表示其他包也能够访问
type Hero struct {
	// 如果说类的属性首字母大写，表示该属性是对外能够访问的（公共属性），否则的话只能够类的内部访问（私有属性）
	Name  string
	Ad    int
	Level int
}

/*
	// this ====>  {Alex 100 1}
	// Name = Alex
	// Ad = 100
	// Level = 1
func (this Hero) Show() {
	fmt.Println("this ====> ", this)
	fmt.Println("Name =", this.Name)
	fmt.Println("Ad =", this.Ad)
	fmt.Println("Level =", this.Level)
}

func (this Hero) GetName() string {
	return this.Name
}

func (this Hero) SetName(newName string) {
	// this 是调用该方法的对象的一个副本（拷贝）
	this.Name = newName
}
*/

func (this *Hero) Show() {
	fmt.Println("this ====> ", this)
	fmt.Println("Name =", this.Name)
	fmt.Println("Ad =", this.Ad)
	fmt.Println("Level =", this.Level)
}

func (this *Hero) GetName() string {
	return this.Name
}

func (this *Hero) SetName(newName string) {
	this.Name = newName
}

func main() {

	// 创建一个对象
	hero1 := Hero{
		Name:  "Alex",
		Ad:    100,
		Level: 1,
	}

	hero1.Show()

	hero1.SetName("Mark")
	hero1.Show()

}

/*
this ====>  &{Alex 100 1}
Name = Alex
Ad = 100
Level = 1
this ====>  &{Mark 100 1}
Name = Mark
Ad = 100
Level = 1
*/
